/**
 * 菜单控制器
 * 负责处理与菜单相关的HTTP请求
 * 包括菜单的创建、更新、删除、查询等操作
 */
import MenuService from '../services/menu.service.js';
import logger from '../utils/logger.js';

class MenuController {
	/**
	 * 创建菜单
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async createMenu(req, res, next) {
		try {
			// 获取请求体中的菜单数据
			const menuData = req.body;

			// 验证必填字段
			if (!menuData.name) {
				return res.fail('菜单名称不能为空');
			}

			if (menuData.menu_type === undefined) {
				return res.fail('菜单类型不能为空');
			}

			// 验证菜单类型
			const menuType = parseInt(menuData.menu_type);
			if (![1, 2, 3, 4, 5].includes(menuType)) {
				return res.fail('菜单类型无效，有效值为1-5');
			}

			// 验证路径和组件（对于非权限控制类型的菜单）
			if (menuType !== 5 && !menuData.path) {
				return res.fail('路由路径不能为空');
			}

			if (menuType !== 5 && !menuData.component) {
				return res.fail('组件路径不能为空');
			}

			// 调用服务创建菜单
			const menu = await MenuService.createMenu(menuData);

			// 返回成功响应
			return res.success(menu, '创建菜单成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器创建菜单失败: ${error.message}`);

			// 根据错误类型返回不同的响应
			if (error.message.includes('已存在')) {
				return res.fail(error.message, 400);
			}

			if (error.message.includes('不存在')) {
				return res.fail(error.message, 400);
			}

			// 将其他错误传递给全局错误处理中间件
			next(error);
		}
	}

	/**
	 * 更新菜单
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async updateMenu(req, res, next) {
		try {
			// 获取菜单ID和更新数据
			const { id } = req.params;
			const menuData = req.body;

			// 验证ID
			if (!id || isNaN(parseInt(id))) {
				return res.fail('无效的菜单ID');
			}

			// 验证是否有要更新的数据
			if (Object.keys(menuData).length === 0) {
				return res.fail('未提供要更新的数据');
			}

			// 调用服务更新菜单
			const updatedMenu = await MenuService.updateMenu(parseInt(id), menuData);

			// 返回成功响应
			return res.success(updatedMenu, '更新菜单成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器更新菜单失败: ${error.message}`);

			// 根据错误类型返回不同的响应
			if (error.message.includes('不存在')) {
				return res.notFound(error.message);
			}

			if (error.message.includes('无法修改')) {
				return res.fail(error.message, 400);
			}

			// 将其他错误传递给全局错误处理中间件
			next(error);
		}
	}

	/**
	 * 删除菜单
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async deleteMenu(req, res, next) {
		try {
			// 获取菜单ID
			const { id } = req.params;

			// 验证ID
			if (!id || isNaN(parseInt(id))) {
				return res.fail('无效的菜单ID');
			}

			// 调用服务删除菜单
			await MenuService.deleteMenu(parseInt(id));

			// 返回成功响应
			return res.success(null, '删除菜单成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器删除菜单失败: ${error.message}`);

			// 根据错误类型返回不同的响应
			if (error.message.includes('不存在')) {
				return res.notFound(error.message);
			}

			// 将其他错误传递给全局错误处理中间件
			next(error);
		}
	}

	/**
	 * 获取菜单树
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async getMenuTree(req, res, next) {
		try {
			// 调用服务获取菜单树
			const menuTree = await MenuService.getMenuTree();

			// 返回成功响应
			return res.success(menuTree, '获取菜单树成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器获取菜单树失败: ${error.message}`);

			// 将错误传递给全局错误处理中间件
			next(error);
		}
	}

	/**
	 * 获取用户菜单
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async getUserMenus(req, res, next) {
		try {
			// 获取角色ID
			const { roleId } = req.params;

			// 验证角色ID
			if (!roleId || isNaN(parseInt(roleId))) {
				return res.fail('无效的角色ID');
			}

			// 调用服务获取用户菜单
			const userMenus = await MenuService.getUserMenus(parseInt(roleId));

			// 返回成功响应
			return res.success(userMenus, '获取用户菜单成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器获取用户菜单失败: ${error.message}`);

			// 将错误传递给全局错误处理中间件
			next(error);
		}
	}

	/**
	 * 获取菜单详情
	 * @param {Object} req - Express请求对象
	 * @param {Object} res - Express响应对象
	 * @param {Function} next - Express下一个中间件函数
	 */
	static async getMenuDetail(req, res, next) {
		try {
			// 获取菜单ID
			const { id } = req.params;

			// 验证ID
			if (!id || isNaN(parseInt(id))) {
				return res.fail('无效的菜单ID');
			}

			// 调用模型查询菜单详情
			const menu = await MenuService.findById(parseInt(id));

			// 检查菜单是否存在
			if (!menu) {
				return res.notFound('菜单不存在');
			}

			// 返回成功响应
			return res.success(menu, '获取菜单详情成功');
		} catch (error) {
			// 记录错误日志
			logger.error(`控制器获取菜单详情失败: ${error.message}`);

			// 将错误传递给全局错误处理中间件
			next(error);
		}
	}
}

export default MenuController;